
#ifndef __APR_MUTEX_H
#define __APR_MUTEX_H

#include <apr_thread_mutex.h>
#include <apr_thread_cond.h>

class APRMutex
{
   private:
      bool init(apr_pool_t *mp)
      {
         apr_thread_mutex_create(&aprt_mutex, APR_THREAD_MUTEX_UNNESTED, mp);
         apr_thread_cond_create(&aprt_cond, mp);
         return true;
      }
      bool destroy()
      {
         apr_thread_mutex_destroy(aprt_mutex);
         apr_thread_cond_destroy(aprt_cond);
         return true;
      }
   protected:
      apr_thread_mutex_t *aprt_mutex;
      apr_thread_cond_t *aprt_cond;
   public:
      APRMutex(apr_pool_t *mp) { init(mp); }
      virtual ~APRMutex() { destroy(); }
      bool lock() { apr_thread_mutex_lock(aprt_mutex); return true; }
      bool unlock() { apr_thread_mutex_unlock(aprt_mutex); return true; }
      bool wait() { apr_thread_cond_wait(aprt_cond, aprt_mutex); return true; }
      bool timedwait(int msecs) { apr_thread_cond_timedwait(aprt_cond, aprt_mutex, (apr_interval_time_t)msecs); return true; }
      bool signal() { apr_thread_cond_signal(aprt_cond); return true; }
};

#endif
